package com.mastercard.assets.web.struts.actions;

import com.mastercard.assets.jpa.TblAlertaUsuario;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.jpa.TblFormaAlerta;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.util.to.UserLogin;

public class AlertsIndex
        extends Action {

    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws
            IOException,
            ServletException {
        HttpSession session = request.getSession();

        // en caos de null
        if (session == null) {
            return mapping.findForward("noLogin");
        }

        // toma el userLogin
        UserLogin user = (UserLogin) session.getAttribute("UserLogin");

        // en caso de null
        if (user == null) {
            return mapping.findForward("noLogin");
        }        

        int userId = user.getCveUsuario(), rol = user.getActualRoleId(), cuenta = user.getActualCountId(), clvCuenta = 0, cuentaAlerta = 0 ;
        
        List<TblAlertaUsuario> sinLeer = MasterCardDAO.getNoLeidas( userId ) ; // user.getAlertsNotReaded( ) ;
        List<TblAlertaUsuario> leidas = MasterCardDAO.getLeidas( userId ) ; //user.getAlertsReaded();

        List< TblAlertaUsuario> resSinLeer = new ArrayList< TblAlertaUsuario>();
        List< TblAlertaUsuario> resLidas = new ArrayList< TblAlertaUsuario>();

        // valida el rol
        if (rol == 2) {

            // recorre alertas sin leer
            for (TblAlertaUsuario alert : sinLeer) {
                int clvRol = 0;

                // la alerta debe tener la clave del usuario
                if (alert.getTblUsuario().getCveUsuario() == userId) {

                    if( alert.getTblNotificacion( ) == null )
                        {
                            List< TblFormaAlerta > fa = alert.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                            for( TblFormaAlerta FA : fa )
                            {
                                if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&
                                        ( FA.getTblRole( ).getCveRole( ) == rol ) )
                                {
                                    resSinLeer.add(alert);
                                }
                            }
                        }else{
                            
                            int alNot = alert.getTblNotificacion().getTblRole().getCveRole();                        

                            if (alNot == rol) {
                                clvRol = 1;
                            }

                            if (clvRol == 1) {
                                resSinLeer.add(alert);
                            }
                            
                        }
                }
            }

            // recorre alertas leer
            for (TblAlertaUsuario alert2 : leidas) {
                int clvRol = 0;

                // la alerta debe tener la clave del usuario
                if (alert2.getTblUsuario().getCveUsuario() == userId) {

                    if( alert2.getTblNotificacion( ) == null )
                        {
                            List< TblFormaAlerta > fa = alert2.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                            for( TblFormaAlerta FA : fa )
                            {
                                if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&
                                        ( FA.getTblRole( ).getCveRole( ) == rol ) )
                                {
                                    resLidas.add(alert2);
                                }
                            }
                        }else{
                            
                            int alNot = alert2.getTblNotificacion().getTblRole().getCveRole();                        

                            if (alNot == rol) {
                                clvRol = 1;
                            }

                            if (clvRol == 1) {
                                resLidas.add(alert2);
                            }
                            
                        }
                }
            }
        } else {

            // recorre alertas sin leer
            for (TblAlertaUsuario alert : sinLeer) {
                int clvRol = 0;
                // si tiene numero de cuenta
                if (alert.getTblCuenta() != null) {                    
                    cuentaAlerta = alert.getTblCuenta().getCveCuenta();
                    
                    // la alerta debe tener la clave del usuario
                    if (alert.getTblUsuario().getCveUsuario() == userId && cuentaAlerta == cuenta) {

                        if( alert.getTblNotificacion( ) == null )
                        {
                            List< TblFormaAlerta > fa = alert.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                            for( TblFormaAlerta FA : fa )
                            {
                                if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&
                                        ( FA.getTblRole( ).getCveRole( ) == rol ) )
                                {
                                    resSinLeer.add(alert);
                                }
                            }
                        }else{
                            
                            int alNot = alert.getTblNotificacion().getTblRole().getCveRole();                        

                            if (alNot == rol) {
                                clvRol = 1;
                            }

                            if (clvRol == 1) {
                                resSinLeer.add(alert);
                            }
                            
                        }
                    }
                }
                        // sin no tiene numero de ceunta
                else
                    
                    if ( alert.getTblNotificacion().getTblRole().getCveRole() == rol && alert.getTblUsuario().getCveUsuario() == userId 
                            && alert.getLeida() == 1 && 
                            (alert.getTblNotificacion().getTipoNotificacion() > 6 ||
                             alert.getTblNotificacion().getTipoNotificacion() == 1 ||
                             alert.getTblNotificacion().getTipoNotificacion() == 2 ) )                         
                        resSinLeer.add(alert);

            }

            // recorre alertas leer
            for (TblAlertaUsuario alert2 : leidas) {
                int clvRol = 0;
                if (alert2.getTblCuenta() != null) {
                    cuentaAlerta = alert2.getTblCuenta().getCveCuenta();
                    
                    // la alerta debe tener la clave del usuario
                    if (alert2.getTblUsuario().getCveUsuario() == userId && cuentaAlerta == cuenta) {

                        if( alert2.getTblNotificacion( ) == null )
                        {
                            List< TblFormaAlerta > fa = alert2.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                            for( TblFormaAlerta FA : fa )
                            {
                                if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&
                                        ( FA.getTblRole( ).getCveRole( ) == rol ) )
                                {
                                    resLidas.add(alert2);
                                }
                            }
                        }else{
                            
                            int alNot = alert2.getTblNotificacion().getTblRole().getCveRole();                        

                            if (alNot == rol) {
                                clvRol = 1;
                            }

                            if (clvRol == 1) {
                                resLidas.add(alert2);
                            }
                            
                        }
                    }
                    
                }else
                    
                    if ( alert2.getTblNotificacion().getTblRole().getCveRole() == rol && alert2.getTblUsuario().getCveUsuario() == userId 
                            && alert2.getLeida() == 2 && alert2.getTblNotificacion().getTipoNotificacion() > 6 )                         
                        resLidas.add(alert2);
                
            }

        }
        
        for( TblAlertaUsuario userAlert : resSinLeer ) {
            String texto = userAlert.getTexto( ) ;
            
            texto = texto.replaceAll("ñ", "&ntilde;") ;
            texto = texto.replaceAll("ó", "&oacute;") ;
            texto = texto.replaceAll("í", "&iacute;") ;
            texto = texto.replaceAll("ú", "&uacute;") ;
            texto = texto.replaceAll("á", "&aacute;") ;
            texto = texto.replaceAll("é", "&eacute;") ;
            
            userAlert.setTexto( texto ) ;
            
        }
        
        for( TblAlertaUsuario userAlertL : resLidas ) {
            String textoL = userAlertL.getTexto( ) ;
            
            textoL = textoL.replaceAll("ñ", "&ntilde;") ;
            textoL = textoL.replaceAll("ó", "&oacute;") ;
            textoL = textoL.replaceAll("í", "&iacute;") ;
            textoL = textoL.replaceAll("ú", "&uacute;") ;
            textoL = textoL.replaceAll("á", "&aacute;") ;
            textoL = textoL.replaceAll("é", "&eacute;") ;
            
            userAlertL.setTexto( textoL ) ;
            
        }

        request.setAttribute("Alertas", resSinLeer);
        request.setAttribute("AlertasLeidas", resLidas);
        user.setNumAler( resSinLeer.size( ) ) ;
        session.setAttribute( "UserLogin" , user ) ;

        if( user.getIdioma( ) == 0 ) {
            // en caso de que se cumpla, guarda el WorkArea
            user.setNextWorkArea("/WEB-INF/pages/WorkArea/AlertsIndex.jsp");
            return mapping.findForward("success");
        } else {
            user.setNextWorkArea("/WEB-INF/pages/WorkAreaEng/AlertsIndex.jsp");
            return mapping.findForward("successEng");
        }
        
    }
}
